﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using SGAEntidades;
using SGABDUtil;
using SGAInterfaces;

namespace SGAAccesoDatos
{
    public class HojaRuta : IHojaRuta
    {
        #region Miembros de IHojaRuta

        public IList<HojaRutaInfo> Listar(HojaRutaInfo oHojaRuta)
        {
            var sqlParm = new SqlParameter[8];
            var oListaHojaRuta = new List<HojaRutaInfo>();

            sqlParm[0] = new SqlParameter("@Id_Hoja_Ruta", SqlDbType.VarChar);
            if (oHojaRuta.IdHojaRuta != null) { sqlParm[0].Value = oHojaRuta.IdHojaRuta; } else { sqlParm[0].Value = DBNull.Value; }

            sqlParm[1] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
            if (oHojaRuta.IdEmpleado != null) { sqlParm[1].Value = oHojaRuta.IdEmpleado; } else { sqlParm[1].Value = DBNull.Value; }

            sqlParm[2] = new SqlParameter("@Placa", SqlDbType.VarChar);
            if (oHojaRuta.Placa != null) { sqlParm[2].Value = oHojaRuta.Placa; } else { sqlParm[2].Value = DBNull.Value; }

            sqlParm[3] = new SqlParameter("@Fecha_Inicio_Desde", SqlDbType.DateTime);
            if (oHojaRuta.FechaInicioDesde.HasValue) { sqlParm[3].Value = oHojaRuta.FechaInicioDesde; } else { sqlParm[3].Value = DBNull.Value; }

            sqlParm[4] = new SqlParameter("@Fecha_Inicio_Hasta", SqlDbType.DateTime);
            if (oHojaRuta.FechaInicioHasta.HasValue) { sqlParm[4].Value = oHojaRuta.FechaInicioHasta; } else { sqlParm[4].Value = DBNull.Value; }

            sqlParm[5] = new SqlParameter("@Fecha_Fin_Desde", SqlDbType.DateTime);
            if (oHojaRuta.FechaFinDesde.HasValue) { sqlParm[5].Value = oHojaRuta.FechaFinDesde; } else { sqlParm[5].Value = DBNull.Value; }

            sqlParm[6] = new SqlParameter("@Fecha_Fin_Hasta", SqlDbType.DateTime);
            if (oHojaRuta.FechaFinHasta.HasValue) { sqlParm[6].Value = oHojaRuta.FechaFinHasta; } else { sqlParm[6].Value = DBNull.Value; }

            sqlParm[7] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
            if (oHojaRuta.IdEstado != null) { sqlParm[7].Value = oHojaRuta.IdEstado; } else { sqlParm[7].Value = DBNull.Value; }

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_HOJA_RUTA", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaHojaRuta.Add(new HojaRutaInfo(drd.GetString(0).Trim(),
                                drd.GetString(1).Trim(), new EmpleadoInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim(), null, new AreaEmpleadoInfo(null, drd.GetString(19).Trim(), null), null, null),
                                drd.GetString(3).Trim(), new VehiculoInfo(drd.GetString(3).Trim(), null, null, null, null, null, null, null, null, null, null, null, null, Double.Parse(drd.GetValue(20).ToString()), null, drd.GetString(4).Trim(),
                                    new TipoCombustibleInfo(drd.GetString(4).Trim(), drd.GetString(18).Trim()), null, null, null, null),
                                drd.GetDateTime(5), drd.GetDateTime(6), drd.GetString(7).Trim(), new UbigeoInfo(drd.GetString(7).Trim(), null, null, drd.GetString(8).Trim()),
                                drd.GetString(9).Trim(), new UbigeoInfo(null, drd.GetString(9).Trim(), null, drd.GetString(10).Trim()),
                                Double.Parse(drd.GetValue(11).ToString()), Double.Parse(drd.GetValue(12).ToString()), Double.Parse(drd.GetValue(13).ToString()),
                                Double.Parse(drd.GetValue(14).ToString()), drd.GetString(15).Trim(),
                                drd.GetString(16).Trim(), new EstadoSolicitudInfo(drd.GetString(16).Trim(), drd.GetString(17).Trim()), null, null, null, null, null, null, null, null
                                ));
                        }
                    }
                }
            }
            return oListaHojaRuta;
        }

        public HojaRutaInfo Consultar(HojaRutaInfo oHojaRuta)
        {
            var sqlParm = new SqlParameter[8];
            var oEntHojaRuta = new HojaRutaInfo();

            sqlParm[0] = new SqlParameter("@Id_Hoja_Ruta", SqlDbType.VarChar);
            if (oHojaRuta.IdHojaRuta != null) { sqlParm[0].Value = oHojaRuta.IdHojaRuta; } else { sqlParm[0].Value = DBNull.Value; }

            sqlParm[1] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
            if (oHojaRuta.IdEmpleado != null) { sqlParm[1].Value = oHojaRuta.IdEmpleado; } else { sqlParm[1].Value = DBNull.Value; }

            sqlParm[2] = new SqlParameter("@Placa", SqlDbType.VarChar);
            if (oHojaRuta.Placa != null) { sqlParm[2].Value = oHojaRuta.Placa; } else { sqlParm[2].Value = DBNull.Value; }

            sqlParm[3] = new SqlParameter("@Fecha_Inicio_Desde", SqlDbType.DateTime);
            if (oHojaRuta.FechaInicioDesde.HasValue) { sqlParm[3].Value = oHojaRuta.FechaInicioDesde; } else { sqlParm[3].Value = DBNull.Value; }

            sqlParm[4] = new SqlParameter("@Fecha_Inicio_Hasta", SqlDbType.DateTime);
            if (oHojaRuta.FechaInicioHasta.HasValue) { sqlParm[4].Value = oHojaRuta.FechaInicioHasta; } else { sqlParm[4].Value = DBNull.Value; }

            sqlParm[5] = new SqlParameter("@Fecha_Fin_Desde", SqlDbType.DateTime);
            if (oHojaRuta.FechaFinDesde.HasValue) { sqlParm[5].Value = oHojaRuta.FechaFinDesde; } else { sqlParm[5].Value = DBNull.Value; }

            sqlParm[6] = new SqlParameter("@Fecha_Fin_Hasta", SqlDbType.DateTime);
            if (oHojaRuta.FechaFinHasta.HasValue) { sqlParm[6].Value = oHojaRuta.FechaFinHasta; } else { sqlParm[6].Value = DBNull.Value; }

            sqlParm[7] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
            if (oHojaRuta.IdEstado != null) { sqlParm[7].Value = oHojaRuta.IdEstado; } else { sqlParm[7].Value = DBNull.Value; }

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_HOJA_RUTA", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        drd.Read();
                        oEntHojaRuta = new HojaRutaInfo(drd.GetString(0).Trim(),
                                drd.GetString(1).Trim(), new EmpleadoInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim(), null, new AreaEmpleadoInfo(null, drd.GetString(19).Trim(), null), null, null),
                                drd.GetString(3).Trim(), new VehiculoInfo(drd.GetString(3).Trim(), null, null, null, null, null, null, null, null, null, null, null, null, Double.Parse(drd.GetValue(20).ToString()), null, drd.GetString(4).Trim(),
                                    new TipoCombustibleInfo(drd.GetString(4).Trim(), drd.GetString(18).Trim()), null, null, null,null),
                                drd.GetDateTime(5), drd.GetDateTime(6), drd.GetString(7).Trim(), new UbigeoInfo(drd.GetString(7).Trim(), null, null, drd.GetString(8).Trim()),
                                drd.GetString(9).Trim(), new UbigeoInfo(null, drd.GetString(9).Trim(), null, drd.GetString(10).Trim()),
                                Double.Parse(drd.GetValue(11).ToString()), Double.Parse(drd.GetValue(12).ToString()), Double.Parse(drd.GetValue(13).ToString()),
                                Double.Parse(drd.GetValue(14).ToString()), drd.GetString(15).Trim(),
                                drd.GetString(16).Trim(), new EstadoSolicitudInfo(drd.GetString(16).Trim(), drd.GetString(17).Trim()), null, null, null, null, null, null, null, null
                                );
                    }
                }
            }
            return oEntHojaRuta;
        }

        public bool Registrar(HojaRutaInfo oHojaRuta, ref String sIdHojaRuta)
        {
            var bExito = false;
            var sqlParm = new SqlParameter[14];
            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {

                    sqlParm[0] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
                    if (oHojaRuta.IdEmpleado != null)
                        sqlParm[0].Value = oHojaRuta.IdEmpleado;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Placa", SqlDbType.VarChar);
                    if (oHojaRuta.Placa != null)
                        sqlParm[1].Value = oHojaRuta.Placa;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Fecha_Inicio", SqlDbType.DateTime);
                    if (oHojaRuta.FechaInicio.HasValue)
                        sqlParm[2].Value = oHojaRuta.FechaInicio;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Fecha_Fin", SqlDbType.DateTime);
                    if (oHojaRuta.FechaFin.HasValue)
                        sqlParm[3].Value = oHojaRuta.FechaFin;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Id_Departamento", SqlDbType.VarChar);
                    if (oHojaRuta.IdDepartamento != null)
                        sqlParm[4].Value = oHojaRuta.IdDepartamento;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    sqlParm[5] = new SqlParameter("@Id_Provincia", SqlDbType.VarChar);
                    if (oHojaRuta.IdProvincia != null)
                        sqlParm[5].Value = oHojaRuta.IdProvincia;
                    else
                        sqlParm[5].Value = DBNull.Value;

                    sqlParm[6] = new SqlParameter("@Total_Km", SqlDbType.Decimal);
                    if (oHojaRuta.TotalKm.HasValue)
                        sqlParm[6].Value = oHojaRuta.TotalKm;
                    else
                        sqlParm[6].Value = DBNull.Value;

                    sqlParm[7] = new SqlParameter("@Total_Km_Empresa", SqlDbType.Decimal);
                    if (oHojaRuta.TotalKmEmpresa.HasValue)
                        sqlParm[7].Value = oHojaRuta.TotalKmEmpresa;
                    else
                        sqlParm[7].Value = DBNull.Value;

                    sqlParm[8] = new SqlParameter("@Total_Km_Personal", SqlDbType.Decimal);
                    if (oHojaRuta.TotalKmPersonal.HasValue)
                        sqlParm[8].Value = oHojaRuta.TotalKmPersonal;
                    else
                        sqlParm[8].Value = DBNull.Value;

                    sqlParm[9] = new SqlParameter("@Galones_Asignados", SqlDbType.Decimal);
                    if (oHojaRuta.GalonesAsignados.HasValue)
                        sqlParm[9].Value = oHojaRuta.GalonesAsignados;
                    else
                        sqlParm[9].Value = DBNull.Value;

                    sqlParm[10] = new SqlParameter("@Observaciones", SqlDbType.VarChar);
                    if (oHojaRuta.Observaciones != null)
                        sqlParm[10].Value = oHojaRuta.Observaciones;
                    else
                        sqlParm[10].Value = DBNull.Value;

                    sqlParm[11] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
                    if (oHojaRuta.IdEstado != null)
                        sqlParm[11].Value = oHojaRuta.IdEstado;
                    else
                        sqlParm[11].Value = DBNull.Value;

                    sqlParm[12] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oHojaRuta.UsuarioSistema != null)
                        sqlParm[12].Value = oHojaRuta.UsuarioSistema;
                    else
                        sqlParm[12].Value = DBNull.Value;

                    sqlParm[13] = new SqlParameter("@Id", SqlDbType.VarChar, 10) { Direction = ParameterDirection.Output };

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_REGISTRAR_HOJA_RUTA", sqlParm);
                    sIdHojaRuta = sqlParm[13].Value.ToString();

                    var oAdHojaRutaDetalle = new HojaRutaDetalle();
                    foreach (var oDetalle in oHojaRuta.DetalleRuta)
                    {
                        oDetalle.IdHojaRuta = sIdHojaRuta;
                        oDetalle.UsuarioSistema = oHojaRuta.UsuarioSistema;
                        if (!oAdHojaRutaDetalle.Registrar(oDetalle, trx))
                        {
                            break;
                        }
                        else
                        {
                            bExito = true;
                        }
                    }

                    if (bExito)
                    {
                        trx.Commit();
                    }
                    else
                    {
                        trx.Rollback();
                    }
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return bExito;
        }

        public bool Actualizar(HojaRutaInfo oHojaRuta)
        {
            Boolean bExito = false;
            var sqlParm = new SqlParameter[14];
            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Id_Hoja_Ruta", SqlDbType.VarChar);
                    if (oHojaRuta.IdHojaRuta != null)
                        sqlParm[0].Value = oHojaRuta.IdHojaRuta;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
                    if (oHojaRuta.IdEmpleado != null)
                        sqlParm[1].Value = oHojaRuta.IdEmpleado;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Placa", SqlDbType.VarChar);
                    if (oHojaRuta.Placa != null)
                        sqlParm[2].Value = oHojaRuta.Placa;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Fecha_Inicio", SqlDbType.DateTime);
                    if (oHojaRuta.FechaInicio.HasValue)
                        sqlParm[3].Value = oHojaRuta.FechaInicio;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Fecha_Fin", SqlDbType.DateTime);
                    if (oHojaRuta.FechaFin.HasValue)
                        sqlParm[4].Value = oHojaRuta.FechaFin;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    sqlParm[5] = new SqlParameter("@Id_Departamento", SqlDbType.VarChar);
                    if (oHojaRuta.IdDepartamento != null)
                        sqlParm[5].Value = oHojaRuta.IdDepartamento;
                    else
                        sqlParm[5].Value = DBNull.Value;

                    sqlParm[6] = new SqlParameter("@Id_Provincia", SqlDbType.VarChar);
                    if (oHojaRuta.IdProvincia != null)
                        sqlParm[6].Value = oHojaRuta.IdProvincia;
                    else
                        sqlParm[6].Value = DBNull.Value;

                    sqlParm[7] = new SqlParameter("@Total_Km", SqlDbType.Decimal);
                    if (oHojaRuta.TotalKm.HasValue)
                        sqlParm[7].Value = oHojaRuta.TotalKm;
                    else
                        sqlParm[7].Value = DBNull.Value;

                    sqlParm[8] = new SqlParameter("@Total_Km_Empresa", SqlDbType.Decimal);
                    if (oHojaRuta.TotalKmEmpresa.HasValue)
                        sqlParm[8].Value = oHojaRuta.TotalKmEmpresa;
                    else
                        sqlParm[8].Value = DBNull.Value;

                    sqlParm[9] = new SqlParameter("@Total_Km_Personal", SqlDbType.Decimal);
                    if (oHojaRuta.TotalKmPersonal.HasValue)
                        sqlParm[9].Value = oHojaRuta.TotalKmPersonal;
                    else
                        sqlParm[9].Value = DBNull.Value;

                    sqlParm[10] = new SqlParameter("@Galones_Asignados", SqlDbType.Decimal);
                    if (oHojaRuta.GalonesAsignados.HasValue)
                        sqlParm[10].Value = oHojaRuta.GalonesAsignados;
                    else
                        sqlParm[10].Value = DBNull.Value;

                    sqlParm[11] = new SqlParameter("@Observaciones", SqlDbType.VarChar);
                    if (oHojaRuta.Observaciones != null)
                        sqlParm[11].Value = oHojaRuta.Observaciones;
                    else
                        sqlParm[11].Value = DBNull.Value;

                    sqlParm[12] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
                    if (oHojaRuta.IdEstado != null)
                        sqlParm[12].Value = oHojaRuta.IdEstado;
                    else
                        sqlParm[12].Value = DBNull.Value;

                    sqlParm[13] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oHojaRuta.UsuarioSistema != null)
                        sqlParm[13].Value = oHojaRuta.UsuarioSistema;
                    else
                        sqlParm[13].Value = DBNull.Value;


                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_ACTUALIZAR_HOJA_RUTA", sqlParm);

                    var oAdHojaRutaDetalle = new HojaRutaDetalle();
                    foreach (var oDetalle in oHojaRuta.DetalleRuta)
                    {
                        oDetalle.UsuarioSistema = oHojaRuta.UsuarioSistema;
                        if (!oAdHojaRutaDetalle.Registrar(oDetalle, trx))
                        {
                            break;
                        }
                        else
                        {
                            bExito = true;
                        }
                    }

                    if (bExito)
                    {
                        trx.Commit();
                    }
                    else
                    {
                        trx.Rollback();
                    }

                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return bExito;
        }

        public bool Aprobar(HojaRutaInfo oHojaRuta)
        {
            Boolean bExito;
            var sqlParm = new SqlParameter[4];
            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Id_Hoja_Ruta", SqlDbType.VarChar);
                    if (oHojaRuta.IdHojaRuta != null)
                        sqlParm[0].Value = oHojaRuta.IdHojaRuta;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
                    if (oHojaRuta.IdEstado != null)
                        sqlParm[1].Value = oHojaRuta.IdEstado;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Usuario_Aprobacion", SqlDbType.VarChar);
                    if (oHojaRuta.UsuarioAprobacion != null)
                        sqlParm[2].Value = oHojaRuta.UsuarioAprobacion;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Usuario_Atencion", SqlDbType.VarChar);
                    if (oHojaRuta.UsuarioAtencion != null)
                        sqlParm[3].Value = oHojaRuta.UsuarioAtencion;
                    else
                        sqlParm[3].Value = DBNull.Value;


                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_ACTUALIZAR_ESTADO_HOJA_RUTA", sqlParm);
                    bExito = true;
                    trx.Commit();

                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return bExito;
        }

        #endregion
    }
}
